﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ModeloMagiPack.Entidades;
using MaGiPack.Movimientos;
using BLLMagiPack.Managers;

namespace MaGiPack.Facturacion
{
    public partial class FrmFactura : Form
    {
        private List<FacturaDetalle> _detalles;
        private List<FacturaCheque> _facturaCheques;
        private bool _usarProveedores;
        private Proveedor _proveedor;

        public List<FacturaCheque> Cheques { get { return _facturaCheques; } }
        public List<FacturaDetalle> Detalles { get { return _detalles; } }
        public Factura Factura { get { return bsFactura.DataSource as Factura; } }

        public Proveedor Proveedor 
        {
            get
            {
                if (!_usarProveedores)
                    return null;

                return (cboProveedores.SelectedItem as Proveedor);
            }
        }

        public FrmFactura(bool usarProveedores)
        {
            InitializeComponent();
            bsFactura.DataSource = new Factura() { IVA = Utilidades.IVA, FechaEmision = DateTime.Now, FechaVencimiento = (DateTime.Now.AddDays(30)) };
            _detalles = new List<FacturaDetalle>();
            _facturaCheques = new List<FacturaCheque>();
            _usarProveedores = usarProveedores;
        }

        public FrmFactura(int idFactura)
        {
            InitializeComponent();
            bsFactura.DataSource = new BLLFactura().TraerFactura(idFactura);
            _detalles = new BLLFacturaDetalle().TraerDetalles(idFactura);
            _facturaCheques = new BLLFacturaCheque().TraerPorFactura(idFactura);

            Proveedor proveedor = new BLLProveedor().TraerProveedorPorFactura(idFactura);
            Text = "Editando Factura";
            if (proveedor != null)
            {
                _proveedor = proveedor;
                _usarProveedores = true;
            }
        }

        private void TraerProveedores()
        {
            bsProveedores.DataSource = new BLLProveedor().TraerProveedores();
        }

        private bool ValidarDatos()
        {
            bool valido = Utilidades.ValidarDatos(gbDatos, errorFacutra);

            if (_detalles.Count == 0)
            {
                MessageBox.Show("Debe cargar al menos un detalle de la factura", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            return valido;
        }


        private void FrmFactura_Load(object sender, EventArgs e)
        {
            lblProveedor.Visible = cboProveedores.Visible = _usarProveedores;
            if (_usarProveedores)
                TraerProveedores();

            ActualizarDetalles();
            ActualizarCheques();
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            if (!ValidarDatos())
                return;

            DialogResult = DialogResult.OK;
            Close();
        }

        #region Detalles

        private void ActualizarDetalles()
        {
            bsDetalle.DataSource = null;
            bsDetalle.DataSource = _detalles;
            btnRemover.Enabled = btnEditar.Enabled = dgvDetalles.SelectedRows.Count > 0;
        }

        private void CalcularTotales()
        {
            if (_detalles.Count == 0)
            {
                txtSubTotal.Text = txtMontoIVA.Text = txtTotal.Text = "0";
                return;
            }

            decimal porcentajeIVA = (txtPorcentajeIVA.TextLength == 0) ? 0 : decimal.Parse(txtPorcentajeIVA.Text);
            decimal subtotal = (_detalles.Sum(d => d.Cantidad) * _detalles.Sum(d => d.PrecioUnitario));
            decimal concha = (porcentajeIVA / 100 + 1);
            decimal total = subtotal * concha;

            txtSubTotal.Text = subtotal.ToString("N2");
            txtMontoIVA.Text = (total - subtotal).ToString("N2");
            txtTotal.Text = total.ToString("N2");
        }


        private void txtPorcentajeIVA_TextChanged(object sender, EventArgs e)
        {
            CalcularTotales();
        }

        private void dgvDetalles_Click(object sender, EventArgs e)
        {
            btnRemover.Enabled = btnEditar.Enabled = dgvDetalles.SelectedRows.Count > 0;
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            FrmFacturaDetalle frmFacturaDetalle = new FrmFacturaDetalle();
            frmFacturaDetalle.StartPosition = FormStartPosition.CenterScreen;

            if (frmFacturaDetalle.ShowDialog() == DialogResult.OK)
            {
                _detalles.Add(frmFacturaDetalle.Detalle);
                ActualizarDetalles();
                CalcularTotales();
            }
        }

        private void btnRemover_Click(object sender, EventArgs e)
        {
            if (dgvDetalles.SelectedRows.Count == 0)
                return;

            _detalles.RemoveAt(dgvDetalles.SelectedRows[0].Index);
            ActualizarDetalles();
            CalcularTotales();
        }

        private void btnEditar_Click(object sender, EventArgs e)
        {
            if (dgvDetalles.SelectedRows.Count == 0)
                return;

            FacturaDetalle detalle = _detalles[dgvDetalles.SelectedRows[0].Index];
            FrmFacturaDetalle frmFacturaDetalle = new FrmFacturaDetalle(detalle);
            frmFacturaDetalle.StartPosition = FormStartPosition.CenterScreen;

            if (frmFacturaDetalle.ShowDialog() == DialogResult.OK)
            {
                _detalles[dgvDetalles.SelectedRows[0].Index] = frmFacturaDetalle.Detalle;
                ActualizarDetalles();
                CalcularTotales();
            }
        }

        #endregion

        #region Cheques

        private void ActualizarCheques()
        {
            dgvChequesAsignados.DataSource = (from a in _facturaCheques
                                              select new
                                              {
                                                  IdCheque = new BLLCheque().TraerCheque(a.IdCheque).IdCheque,
                                                  Numero = new BLLCheque().TraerCheque(a.IdCheque).Numero,
                                                  Importe = new BLLCheque().TraerCheque(a.IdCheque).Importe,
                                                  FechaPago = a.Fecha.ToShortDateString()
                                              }).ToList();
        }

        private void dgvChequesAsignados_SelectionChanged(object sender, EventArgs e)
        {
            btnRemoverCheque.Enabled = dgvChequesAsignados.SelectedRows.Count > 0;
        }

        private void btnAgregarCheque_Click(object sender, EventArgs e)
        {
            FrmSeleccionCheque frmSeleccionCheque = new FrmSeleccionCheque();
            frmSeleccionCheque.StartPosition = FormStartPosition.CenterScreen;
            if (frmSeleccionCheque.ShowDialog() == DialogResult.OK)
            {
                _facturaCheques.Add(frmSeleccionCheque.FacturaChequeDatos);
                ActualizarCheques();
            }
        }

        private void btnRemoverCheque_Click(object sender, EventArgs e)
        {
            foreach (DataGridViewRow fila in dgvChequesAsignados.SelectedRows)
            {
                int idCheque = (int)fila.Cells["IdCheque"].Value;
                _facturaCheques.Remove(_facturaCheques.Where(fc => fc.IdCheque == idCheque).FirstOrDefault());
                ActualizarCheques();
            }

            ActualizarCheques();
        }

        #endregion
    }
}
